#include <iostream>
#include <string.h>
#include <vector>
using namespace std;
const int SIZE =240;
bool map[SIZE][SIZE];
vector<int> linkmap[SIZE];
bool used[SIZE];
int brea[SIZE];
int cow,stall;
int cnt=0;
void init();
void edmonds();
bool dfs(int);
int main()
{
    freopen("dat.in","r",stdin);
    freopen("dat.out","w",stdout);

    while (scanf("%d%d",&cow,&stall)!=EOF){
        init();
        edmonds();
        printf("%d\n",cnt);
    }
    return 0;
}
void edmonds(){
    int i;
    for (i=1;i<=cow;i++){
        memset(used,false,sizeof(used));
        if (dfs(i))
            cnt++;
    }
}
bool dfs(int node){
    int i;
    int len=linkmap[node].size();
    for (i=0;i<len;i++){
        int tmp=linkmap[node][i];
        if (!used[tmp]){
            used[tmp]=true;
            if (brea[tmp]==-1 || dfs(brea[tmp])){
                brea[tmp]=node;
                return true;
            }
        }
    }
    return false;
}
void init(){
    int i,j;
    for (i=0;i<=stall;i++)
        linkmap[i].clear();
    for (i=1;i<=cow;i++){
        int len,node;
        scanf("%d",&len);
        for (j=0;j<len;j++){
            scanf("%d",&node);
            linkmap[i].push_back(node);
        }
    }
    memset(brea,-1,sizeof(brea));
    cnt=0;
}
